//=========================================================
//	文件名		    :	Interface_TB6612.c	
//	文件功能		:	
//	编程者		    :	guowei
//	日期		    :	2024.09.20
//	编号--------作者----------日期-------------操作---------
//	00	        guowei	     2019.10.26	      创建
//	说明: 接口层，TB6612相关的接口定义
//        TB6612涉及2个PWM输入和4个GPIO管脚输入控制
//==========================================================
#include <stdio.h>
#include "stm32f10x.h"
#include "Driver\Driver_Time.h"


#define AIN1_L GPIOB -> ODR &=~ GPIO_ODR_ODR14
#define AIN1_H GPIOB -> ODR |= GPIO_ODR_ODR14

#define AIN2_L GPIOB -> ODR &=~ GPIO_ODR_ODR15
#define AIN2_H GPIOB -> ODR |= GPIO_ODR_ODR15

#define BIN1_L GPIOB -> ODR &=~ GPIO_ODR_ODR13
#define BIN1_H GPIOB -> ODR |= GPIO_ODR_ODR13

#define BIN2_L GPIOB -> ODR &=~ GPIO_ODR_ODR12
#define BIN2_H GPIOB -> ODR |= GPIO_ODR_ODR12

typedef enum En_Motor_Direction
{
    en_Motor_Direction_Go,
    en_Motor_Direction_Back,
    en_Motor_Direction_Stop,

    en_Motor_Direction_Max,

}En_Motor_Direction_type;


//========================================================
// Function: Interface_TB6612_Init(void)
// Description: 初始化TB6612,2个PWM和4个GPIO管脚控制
// Input：	无
// Output:  无
// Return:  无
// Others: 
//========================================================
void Interface_TB6612_Init(void)
{
    //初始化PWM所在的定时器 初始化控制方向的4个GPIO管脚
    //1 初始化定时器1
    Driver_Time1Init()
    //2 初始化GPIO: PB12 PB13 PB14 PB15
    //2.1 设置GPIO为复用推挽输出  CNF = 00 复用功能推挽输出 ，MODE = 11, 输出模式，最大速度50MHz  //
    GPIOB->CRH |= (GPIO_CRH_MODE12|GPIO_CRH_MODE13|GPIO_CRH_MODE14|GPIO_CRH_MODE15);
    GPIOB->CRH &=~ (GPIO_CRH_CNF12|GPIO_CRH_CNF13|GPIO_CRH_CNF14|GPIO_CRH_CNF15);
}

//========================================================
// Function: Interface_TB6612_MotorA(void)
// Description: 接口层 控制A电机的方向接口
// Input：	无
// Output:  无
// Return:  无
// Others: 
//========================================================
void Interface_TB6612_MotorA(En_Motor_Direction_type dieection)
{
    switch(dieection)
    {
        case en_Motor_Direction_Go:
        {
            //正转
            AIN1_L;
            AIN2_H;
        }
        break;
        case en_Motor_Direction_Back:
        {
            //反转
            AIN1_H;
            AIN2_L;
        }
        break;
        case en_Motor_Direction_Stop:
        {
            //停止
            AIN1_H;
            AIN2_H;
        }
        break;
        default:
        {

        }
        break;
    }
}

//========================================================
// Function: Interface_TB6612_MotorB(void)
// Description: 接口层 控制B电机的方向接口
// Input：	无
// Output:  无
// Return:  无
// Others: 
//========================================================
void Interface_TB6612_MotorB(En_Motor_Direction_type dieection)
{
    switch(dieection)
    {
        case en_Motor_Direction_Go:
        {
            //正转
            BIN1_L;
            BIN2_H;
        }
        break;
        case en_Motor_Direction_Back:
        {
            //反转
            BIN1_H;
            BIN2_L;
        }
        break;
        case en_Motor_Direction_Stop:
        {
            //停止
            BIN1_H;
            BIN2_H;
        }
        break;
        default:
        {

        }
        break;
    }
}

//========================================================
// Function: Interface_TB6612_MotorB(void)
// Description: 接口层 控制B电机的方向接口
// Input：	无
// Output:  无
// Return:  无
// Others: 
//========================================================
void Interface_TB6612_SetPWM(int pwma, int pwmb)
{
    //根据传入的PWM值，1.设置方向  2.设置占空比
    //1.处理pwma
    if(pwma > 0)
    {
        //正转
        Interface_TB6612_MotorB(en_Motor_Direction_Go);
    }
    else if(pwma < 0)
    {
        //反转
        Interface_TB6612_MotorB(en_Motor_Direction_Back);
    }
    else
    {
        //停止
        Interface_TB6612_MotorB(en_Motor_Direction_Stop);
    }
    //1.2 设置对应的pwm值 =》 对应定时器通道CH4的ccr值
    TIM1 ->CCR1 = pwma;

    //2 处理pwmb
    //2.1 根据符号处理方向
    if(pwmb > 0)
    {
        //正转
        Interface_TB6612_MotorB(en_Motor_Direction_Go);
    }
    else if(pwmb < 0)
    {
        //反转
        Interface_TB6612_MotorB(en_Motor_Direction_Back);
    }
    else
    {
        //停止
        Interface_TB6612_MotorB(en_Motor_Direction_Stop);
    }
    //2.2 设置对应的pwm值
    TIM1->CCR4 = pwmb;
}
